
    /**  
    * @Title: WbUtil.java
    * @Package com.third.weibo
    * @Description: 
    * @author likai
    * @date 2017年11月24日
    * @version V1.0  
    */
    
package com.third.utils.weibo;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.supers.enums.Charset;
import com.utils.date.CalendarUtil;
import com.utils.http.HttpClientUtil;

/**
    * @ClassName: WbUtil
    * @Description: 微博开发工具,接口网址：http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2#.E5.BE.AE.E5.8D.9A
    * @author likai
    * @date 2017年11月24日
    *
    */

public class WbUtil{
	public static Logger log = LoggerFactory.getLogger(WbUtil.class);
	private  WbConfig wbConfig;

	private static WbUtil wbUtil;
	
	private WbUtil(WbConfig wbConfig) {
		super();
		this.wbConfig=wbConfig;
	}
	
	public static WbUtil create(WbConfig wbConfig) {
		if (wbUtil==null) {
			wbUtil=new WbUtil(wbConfig);
		}
		return wbUtil;
	}
	
	/* 
	    * @Description:通过code换取网页授权access_token、
	    * 
	    * @return:
	    * 
	    * access_token	用户授权的唯一票据，用于调用微博的开放接口，同时也是第三方应用验证微博用户登录的唯一票据
		* expires_in	access_token接口调用凭证超时时间，单位（秒）
		* uid	授权用户的UID
	    *
	    */
	@SuppressWarnings("unchecked")
	public  Map<String, Object> getAccessTokenByCode(String code,String redirectUri) {
		try {
			String url="https://api.weibo.com/oauth2/access_token?client_id="+wbConfig.getAppKey()+"&client_secret="+wbConfig.getAppSecret()+"&grant_type=authorization_code"+"&code="+code+"&redirect_uri="+redirectUri;
			Map<String, Object> request=new HashMap<String, Object>();
			Map<String, Object> response=(Map<String, Object>) HttpClientUtil.httpJson.postClient(url, request, Charset.UTF8, Map.class);
			if (response.get("error_code")==null) {				
				return response;
			}else {				
				log.info("微博getAccessTokenByCode出错："+response.toString());
				return null;
			}
		} catch (Exception e) {
			log.info("换取微博网页授权access_token失败");
			return null;
		}
	}
	
	/* 
	    * @Description:access_token获取用户信息
	    * 
	    * @return:
	    * 
	    * 
	    * id	int64	用户UID
			idstr	string	字符串型的用户UID
			screen_name	string	用户昵称
			name	string	友好显示名称
			province	int	用户所在省级ID
			city	int	用户所在城市ID
			location	string	用户所在地
			description	string	用户个人描述
			url	string	用户博客地址
			profile_image_url	string	用户头像地址（中图），50×50像素
			profile_url	string	用户的微博统一URL地址
			domain	string	用户的个性化域名
			weihao	string	用户的微号
			gender	string	性别，m：男、f：女、n：未知
			followers_count	int	粉丝数
			friends_count	int	关注数
			statuses_count	int	微博数
			favourites_count	int	收藏数
			created_at	string	用户创建（注册）时间
			following	boolean	暂未支持
			allow_all_act_msg	boolean	是否允许所有人给我发私信，true：是，false：否
			geo_enabled	boolean	是否允许标识用户的地理位置，true：是，false：否
			verified	boolean	是否是微博认证用户，即加V用户，true：是，false：否
			verified_type	int	暂未支持
			remark	string	用户备注信息，只有在查询用户关系时才返回此字段
			status	object	用户的最近一条微博信息字段 详细
			allow_all_comment	boolean	是否允许所有人对我的微博进行评论，true：是，false：否
			avatar_large	string	用户头像地址（大图），180×180像素
			avatar_hd	string	用户头像地址（高清），高清头像原图
			verified_reason	string	认证原因
			follow_me	boolean	该用户是否关注当前登录用户，true：是，false：否
			online_status	int	用户的在线状态，0：不在线、1：在线
			bi_followers_count	int	用户的互粉数
			lang	string	用户当前的语言版本，zh-cn：简体中文，zh-tw：繁体中文，en：英语
	    *
	    */
	@SuppressWarnings("unchecked")
	public  Map<String, Object> getUserInfo(String accessToken,String userId) {
		try {
			String url="https://api.weibo.com/2/users/show.json?access_token="+accessToken+"&uid="+userId;
			Map<String, Object> response=(Map<String, Object>) HttpClientUtil.httpJson.getClient(url, Charset.UTF8, Map.class);
			if (response.get("error_code")==null) {				
				return response;
			}else {				
				log.info("微博getUserInfo出错："+response.toString());
				return null;
			}
		} catch (Exception e) {
			log.info("获取微博用户信息失败");
			return null;
		}
	}
	
	
	/* 
	    * @Description:获取微博JS接口的临时票据
	    * 
	    * @return:
	    * 	js_ticket:票据
	    *   expire_time：有效时间
	    *   date：上次使用时间戳
	    */
	@SuppressWarnings("unchecked")
	public  Map<String, Object> getJsapiTicket() {
		try {			
			Map<String, Object> ticket=wbConfig.getCache("wbTicket");
			if (ticket!=null) {
				int expire_time=(Integer) ticket.get("expire_time");
				Date date=(Date) ticket.get("date");
				if (CalendarUtil.getDaySECOND(date, new Date())+1000<expire_time) {
					//ticket在有效期内
					//log.info("从缓存中获取微博ticket------------------");
					return ticket;
				}
			}
			log.info("重新调用接口获取微博ticket------------------");
			Map<String, Object> response=(Map<String, Object>) HttpClientUtil.httpJson.postClient("https://api.weibo.com/oauth2/js_ticket/generate?client_id="+wbConfig.getAppKey()+"&client_secret="+wbConfig.getAppSecret(),null, Charset.UTF8, Map.class);
			if (response.get("error_code")==null) {
				ticket=new HashMap<String, Object>();
				ticket.put("js_ticket", response.get("js_ticket"));//访问token
				ticket.put("expire_time", response.get("expire_time"));//过期时间
				ticket.put("date", new Date());//添加时间
				wbConfig.putCache("wbTicket", ticket);
				return ticket;
			}else {
				log.info(response.toString());
				return null;
			}	
		} catch (Exception e) {
			log.info("获取访问的ticket失败");
			return null;
		}
	}

}
